package com.feature.learn.stack;

import cn.hutool.json.JSONUtil;

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: wangxc
 * @GitHub: https://github.com/vector4wang
 * @CSDN: http://blog.csdn.net/qqhjqs?viewmode=contents
 * @BLOG: http://vector4wang.tk
 * @wxid: BMHJQS
 * 所有对象的实例分配都在Java堆上分配内存，堆大小由-Xmx和-Xms来调节
 */
public class HeapMain {
//    static class OOMObject {
//
//    }

    public static void main(String[] args) throws InterruptedException {
        byte[] b = new byte[10 * 1024 * 1024]; // 943718400
        // 获取所有内存池MXBean列表，并遍历
        List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();
//        for (MemoryPoolMXBean memoryPoolMXBean : memoryPoolMXBeans) {
//            // 内存分区名
//            String name = memoryPoolMXBean.getName();
//            // 内存管理器名称
//            String[] memoryManagerNames = memoryPoolMXBean.getMemoryManagerNames();
//            // 内存分区类型
//            MemoryType type = memoryPoolMXBean.getType();
//            // 内存使用情况
//            MemoryUsage usage = memoryPoolMXBean.getUsage();
//            // 内存使用峰值情况
//            MemoryUsage peakUsage = memoryPoolMXBean.getPeakUsage();
//            // 打印
//            System.out.println(name + ":");
//            System.out.println("    managers: " + JSONUtil.toJsonStr(memoryManagerNames));
//            System.out.println("    type: " + type.toString());
//            System.out.println("    usage: " + usage.toString());
//            System.out.println("    peakUsage: " + peakUsage.toString());
//            System.out.println("");
//        }

        for (MemoryPoolMXBean memoryPoolMXBean : ManagementFactory.getMemoryPoolMXBeans()) {

            System.out.println(memoryPoolMXBean.getName() + "  总量:" + memoryPoolMXBean.getUsage().getCommitted() + "   使用的内存:" + memoryPoolMXBean.getUsage().getUsed());
        }



//        int count = 0;
//        while (true) {
//            System.out.println(count++);
//            Thread.sleep(1000);
//            new OOMObject();
//        }



    }
}
